iT邦幫忙

2021 iThome 鐵人賽

DAY 8
0
Arm Platforms

STM32 基礎入門教學系列 第 8

【Day8】:ADC電壓採集

  • 分享至 

  • xImage
  •  

類比輸入

自然界當中的訊號幾乎為連續的,也就是我們常說的類比訊號,而對於單晶片或著電腦來說,我們能夠接收的不外乎就是0與1,因此就有了ADC的誕生,ADC全名為Analog-To-Digital Converter,類比轉數位轉換器,透過短時間重複採樣,將連續尋號轉換為離散的。可以想像如果我們採集的頻率越高,越能完整的描述這個連續的訊號,這也就是取樣率的概念
https://ithelp.ithome.com.tw/upload/images/20210905/20141525qDNFowZCpe.png
而另一個重要的概念就是解析度,如果我們能夠將固定的範圍切的更細,那麼我們也就能更好的描述這個類比訊號。
還記得以前在Arduino使用analogRead他回傳的值為0~1023也就是切成1024等分,我們將其稱為10位元解析度的A/D轉換器(1024為2的10次方)。而STM32為12的解析度高達12位元,輸出為0~4095,分成4096等分。不過要注意的是Arduino是將0~5V切成1024等分,而STM32是將0~3.3V分成4096等分。稍微計算一下可以發現3.3/4096=0.000806,一個等分約為0.806mV。

ADC使用

STM32F429ZI單晶片總共有3個ADC轉換器(ADC1~ADC3),而每個轉換器有高達19個通道。
是不是完全聽不懂一下3個、一下19個、又通道...。我們可以想像ADC轉換器就是一台機器,可以將類比訊號轉換為數位訊號,而這台機器有19個開口來接收類比訊號(當然一次還是只能接收一個啦),但這台機器運作的速度非常快(根據我簡單的測量,轉換一次的時間約為11微秒左右),因此就算你19個通道全部都在輸入,那也只需要11X19=209微秒就可以測量完所有的通道,相當的快。
底下為每個ADC轉換器各個通道所對應到的腳位
https://ithelp.ithome.com.tw/upload/images/20210906/20141525mjAoQgbCEq.jpg

單通道轉換

首先我們先來看單通道的轉換

  1. 一樣進入.ioc檔,今天我們終於要來使用左邊那排看起來很複雜的類別了。選Analog底下的ADC1,右邊出現許多框框勾選IN0,現在我們就已經把ADC1的第一個通道打開了。(我們往下滑會發現怎麼只有IN0~IN15,不是說有19個通道嗎?怎麼只有16個呢?其實這塊板子對於外部腳位只有配置16個通道,剩下的3個通道供單晶片內部使用,像是溫度感測等)
  2. 再來底下的Configuration完全不用配置,都使用預設的即可!這樣就完成設定啦~接下來我們來寫程式,實際的來使用看看ADC功能。不過除了上面所說查表的方式可以知道該通道對應的腳位以外,我們也可以再Configuration的地方點GPIO Settings,底下的PinName就是腳位名稱啦,與查表的方式得到的答案相同ADC1的IN0對應的腳位為PA0
  3. https://ithelp.ithome.com.tw/upload/images/20210906/20141525lbuW57NGw2.jpg
  4. 接下來我們要使用3個函式來完成ADC的轉換
HAL_ADC_Start(ADC_HandleTypeDef* hadc)
HAL_ADC_PollForConversion(ADC_HandleTypeDef* hadc, uint32_t Timeout)
HAL_ADC_GetValue(ADC_HandleTypeDef* hadc)

我們依序來介紹。
第一個函式的功能就是啟用ADC轉換器,就像你要使用一台機器前要先把開關打開的道理相同
第二個函式的功能是等待轉換完成後再繼續執行程式。不要忘了這台機器轉換是需要時間的,雖然很快(~11us),因此這個函式就是等待轉換完成後再繼續執行。但如果這台機器出錯,轉換失敗呢?整個程式就一直卡在這裡那還得了,因此Timeout這個參數就是告訴這台機器最多要等多久,單位是ms。
第三個函式看名字就知道,它會回傳轉換的結果

/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */

    HAL_ADC_Start(&hadc1);
    HAL_ADC_PollForConversion(&hadc1,1);
    value = HAL_ADC_GetValue(&hadc1);
}

記得在全域宣告一個整數變數value
每次轉換前都要將ADC轉換器啟用(只要轉換完成就會關掉,因此要放在while迴圈)。
執行後我們就可以用現場表達是來監看轉換完成的value啦


上一篇
【Day7】:GPIO輸入輸出(下)
下一篇
【Day9】:STM32記憶體架構
系列文
STM32 基礎入門教學28
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言